<?php
class SzamlakController extends AppController {

	var $name = 'Szamlak';
	var $components = array('RequestHandler');
	var $paginate = array('limit' => 25, 'order' => 'szam');
	var $uses = array('Szamla', 'Naplo');
	
	function isAuthorized(){
		if($this->Auth->user('csoport') == 1){		//admin jogosultságú júzerek
			return true;
		}
		elseif($this->Auth->user('csoport') == 2){	//könyvelők
			return true;
		}
		elseif($this->Auth->user('csoport') == 3){	//betekintők
			if(in_array($this->request->action, array(
														'search',
														'getList'
														))){
				return true;
			}
		}
		elseif($this->Auth->user('csoport') == 4){	//osztályvezetők
			if(in_array($this->request->action, array(
														'search'
														))){
				return true;
			}
		}
		return false;		//minden más tiltva
	}

	function beforeFilter(){
		parent::beforeFilter();
		//xlsx kezelés hozzáadása
		if($this->RequestHandler->ext == 'xlsx'){
			Configure::write('debug', 0);
			$this->RequestHandler->setContent('xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		}
	}

	function index() {
		$this->Szamla->recursive = 0;
		$this->set('szamlak', $this->paginate('Szamla', array(
																			'Szamla.ev' => array(0, $this->Session->read('Settings.ev')),
																			'ceg_id' => array(0, $this->Session->read('Settings.cegId'))
																			)
														  )
					  );
	}

/*
* Teljes számlatükör lekérése az adott cégre és adott évre
*/
	function szamlatukor(){
		$szamlatukor = $this->Szamla->find('all',
															 array(
																	'conditions' => array(
																								'Szamla.ev' => array(0, $this->Session->read('Settings.ev')),
																								'Szamla.ceg_id' => array(0, $this->Session->read('Settings.cegId')),
																								'Szamla.szam > 0' 
																								),
																	'order' => 'Szamla.szam',
																	'recursive' => -1
																	));
		
		if($this->RequestHandler->ext == 'xlsx'){
			//xlsx legyártása
			App::import('Vendor', 'PHPExcel', array('file' => 'PHPExcel.php'));
			App::import('Vendor', 'PHPExcel_IOFactory', array('file' => 'PHPExcel'.DS.'IOFactory.php'));
			App::import('Vendor', 'PHPExcel_Style', array('file' => 'PHPExcel'.DS.'Style.php'));
			App::import('Vendor', 'PHPExcel_Worksheet', array('file' => 'PHPExcel'.DS.'Worksheet.php'));
			
			$objPHPExcel = new PHPExcel();

			$objPHPExcel->setActiveSheetIndex(0);

			//alap beállítások
			$sheet = $objPHPExcel->getActiveSheet();

			//fejléc
			$sheet = $objPHPExcel->getActiveSheet();
			$sheet->setCellValueByColumnAndRow(0, 2, 'Id')
					->setCellValueByColumnAndRow(1, 2, 'Számlaszám')
					->setCellValueByColumnAndRow(2, 2, 'Számlanév');
		
			//vastagítás, középre igazítás
			$style = $sheet->getStyle('A2:Z2');
			$style->getFont()->setBold(true);
			$style->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
			$style->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
			$sheet->getRowDimension(2)->setRowHeight(25);
		
			//adat tartomány
			foreach($szamlatukor as $i => $szamla){
				$s = $i+3;
				$objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow(0, $s, $szamla['Szamla']['id'])
							->setCellValueByColumnAndRow(1, $s, $szamla['Szamla']['szam'])
							->setCellValueByColumnAndRow(2, $s, $szamla['Szamla']['nev']);
			}
					
					
			//formázások
			$style = array(
						'borders' => array(
											'outline' => array(
																'style' => PHPExcel_Style_Border::BORDER_MEDIUM,
																'color' => array('argb' => '00000000')
																),
											'inside' => array(
																'style' => PHPExcel_Style_Border::BORDER_THIN,
																'color' => array('argb' => '00000000')
																)
											)
						);
			$objPHPExcel->getActiveSheet()->getStyle('A2:C2')->applyFromArray($style);
			//$objPHPExcel->getActiveSheet()->getStyle('A3:C'.($s-1))->applyFromArray($style);
			$objPHPExcel->getActiveSheet()->getStyle('A3:C'.$s)->applyFromArray($style);
		
			//szélesség
			$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);;
			$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
			$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
					
			// Rename sheet
			$objPHPExcel->getActiveSheet()->setTitle('szamlatukor');
			
			// Set active sheet index to the first sheet, so Excel opens this as the first sheet
			$objPHPExcel->setActiveSheetIndex(0);

			// Save Excel 2007 file
			$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
				
			$this->set('objWriter', $objWriter);
		}
	}

	function view($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid Szamla.'));
			$this->redirect(array('action'=>'index'));
		}
		$this->set('szamla', $this->Szamla->read(null, $id));
	}

	function add() {
		if (!empty($this->request->data)) {
			$this->Szamla->create();
			if ($this->Szamla->save($this->request->data)) {
				$this->Session->setFlash(__('The Szamla has been saved'));
				$this->redirect(array('action'=>'index'));
			} else {
				$this->Session->setFlash(__('The Szamla could not be saved. Please, try again.'));
			}
		}
		$gyujtok = $this->Szamla->Gyujto->find('list');
		$this->set(compact('gyujtok'));
	}

	function edit($id = null) {
		if (!$id && empty($this->request->data)) {
			$this->Session->setFlash(__('Invalid Szamla'));
			$this->redirect(array('action'=>'index'));
		}
		if (!empty($this->request->data)) {
			if ($this->Szamla->save($this->request->data)) {
				$this->Session->setFlash(__('The Szamla has been saved'));
				$this->redirect(array('action'=>'index'));
			} else {
				$this->Session->setFlash(__('The Szamla could not be saved. Please, try again.'));
			}
		}
		if (empty($this->request->data)) {
			$this->request->data = $this->Szamla->read(null, $id);
		}
		$gyujtok = $this->Szamla->Gyujto->find('list');
		$this->set(compact('gyujtok'));
	}

	function delete($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid id for Szamla'));
			$this->redirect(array('action'=>'index'));
		}
		if ($this->Szamla->delete($id)) {
			$this->Session->setFlash(__('Szamla deleted'));
			$this->redirect(array('action'=>'index'));
		}
	}

	function search($naploId = null){
		//ajaxos keresés a számlákban
		//Configure::write('debug', 0);
		//a $this->request->data tömbben érkezik a paraméter a felsoroltak egyikeként
		$reszlet = @$this->request->data['Tetel']['account'] .
						@$this->request->data['Tetel']['accountT'] .
						@$this->request->data['Tetel']['accountK'] .
						@$this->request->data['Bizonylat']['szamlatol'] .
						@$this->request->data['Bizonylat']['szamlaig'] .
						@$this->request->data['Bizonylat']['_szamlatol'] .
						@$this->request->data['Bizonylat']['_szamlaig'] .
						@$this->request->data['Naplo']['alapertelmezett_szamla'] .
						@$this->request->data['Szamla']['szamla'] .
						@$this->params->query['term'] ;
		$reszlet =  $reszlet ? $reszlet : 1;
		$rtn = (isset($this->request->data['rtn']) && $this->request->data['rtn'] == 'szam') ? 'szam' : 'id';	//id vagy számlaszám kerüljön a li id-jébe
		if(preg_match('/\D/', $reszlet)){
			//van a keresésben nem-szám is
			$feltetel = array("Szamla.nev LIKE '%$reszlet%'");
		}
		else{
			//csak (számla)szám van a keresési feltételben
			$feltetel =  'LEFT(Szamla.szam, ' . strlen($reszlet) . ') = ' . $reszlet;
		}
		$sz = $this->Szamla->find('all',
								array(
									'conditions' => array($feltetel,
																'Szamla.ceg_id' => array(0, $this->Session->read('Settings.cegId')),
																'Szamla.ev' => array(0, $this->Session->read('Settings.ev'))),
									//'fields' => array('Szamla.id', 'Szamla.szam', 'Szamla.nev'),
									'order' => 'szam ASC',
									'limit' => 5,
									'offset' => isset($this->request->data['offset']) ? $this->request->data['offset'] : 0,
									'recursive' => -1
								)
								);
		//debug($sz);
		/*$this->Szamla->find("szam LIKE '%$reszlet%'
												  OR nev LIKE '%$reszlet%'",
												 null,null, -1));*/
		if($naploId){
			$naploEv = $this->Naplo->getEv($naploId);
			if($sz[0]['Szamla']['ev'] && $naploEv != $sz[0]['Szamla']['ev']){
				$sz = array( array('Szamla' => array('id' => 0,
						   'szam' => 'Év Hiba: ',
						   'nev' => 'A számla ('.$sz[0]['Szamla']['ev'].') és a napló ('.$naploEv.') éve nem azonos!')));
			}
		}

		$this->set('jQ', isset($this->params->query['term']) ? true : false);
		$this->set('rtn', $rtn);
		$this->set('searchResults', $sz);
		$this->render('search_results');
	}
	
/**
 * Számlák listáját a bizonylat számla popuphoz
 * @param string $irany felfelé vagy lefelé lapozás
 * @return nothing
 */
	function getList($irany = null, $szamlaszam = null){
		Configure::write('debug', 0);
		$reszlet = $this->request->data['reszlet'];
		if(isset($irany)){		//választott ki irányt
			if($irany == 'fel'){
				$conditions =  "Szamla.szam < '$szamlaszam'";
				$order = 'DESC';
			}
			else
				$conditions =  "Szamla.szam > '$szamlaszam'";
		}
		else
			$conditions = "Szamla.szam LIKE '$reszlet%'";
		$szamlaLista = $this->Szamla->find('all',
								array(
									'conditions' => $conditions,
									'fields' => array('Szamla.id', 'Szamla.szam', 'Szamla.nev'),
									'order' => 'szam ' . $order,
									'limit' => 15,
									'recursive' => -1
								)
								);
		if($order == 'DESC')
			$szamlaLista = array_reverse($szamlaLista);
		$this->set('szamlaLista', $szamlaLista);
		$this->render('getList','ajax');
	}

/*
* Számlatükör import excel fileból
* az import file cvs számlaszám - számlanév mezőkkel
*
* @return nothing
* @access public
*/
	function import(){
		if(!empty($this->request->data) && is_uploaded_file($this->request->data['Szamla']['File']['tmp_name'])){	//az is_uploaded_file biztosítja, hogy ne lehessen külső fájlokat feltölteni a webről
			$fileData = fread(fopen($this->request->data['Szamla']['File']['tmp_name'], "r"), $this->request->data['Szamla']['File']['size']);
			$file = array(
						'name' => $this->request->data['Szamla']['File']['name'],
						'type' => $this->request->data['Szamla']['File']['type'],
						'tmp_name' => $this->request->data['Szamla']['File']['tmp_name'],
						'error' => $this->request->data['Szamla']['File']['error'],
						'size' => $this->request->data['Szamla']['File']['size'],
						'data' => $fileData
						);
			unset($this->request->data, $fileData);
			
			//debug($file);
			$szamlak = explode("\n", $file['data']);
			//debug($szamlak);
			$uzenet = '';
			$beImportalva = 0;
			foreach($szamlak as $szamla){
				$sz = explode(';', $szamla);
				if(isset($sz[0]) && is_numeric($sz[0])){
					$sz[1] = str_replace('"', '', $sz[1]);	//vegyük ki az esetleges idézőjeleket
					if($sz[1]){		//ha maradt a számlanévben valami
						//kaptunk egy számlaszámot ha nem szerepel a számlatükörben illesszük be
						$this->Szamla->unbindModel(array('belongsTo' => array('Gyujto'), 'hasMany' => array('TartozikTetel', 'KovetelTetel')));
						$letezoSzamla = $this->Szamla->find('first',
																 array(
																		'conditions' => array(
																								'Szamla.szam' => $sz[0],
																								'Szamla.ev' => array(0, $this->Session->read('Settings.ev')),
																								'Szamla.ceg_id' => array(0, $this->Session->read('Settings.cegId'))
																								)
																		 ));
						if(!$letezoSzamla){
							//nem szerepel a számlaszám a számlatükörben, adjuk hozzá
							$ujSzamla = array('Szamla' => array(
																'szam' => $sz[0],
																'ev' => $this->Session->read('Settings.ev'),
																'nev' => $sz[1],
																'ceg_id' => $this->Session->read('Settings.cegId')
																));
							$this->Szamla->create();
							if($this->Szamla->save($ujSzamla))
								$beImportalva++;
							else
								$uzenet .= 'A ' . $sz[0] . ' ' . $sz[1] . ' számlát <i>nem tudtam menteni</i><br />';
						}
						else
						$uzenet .= 'A ' . $sz[0] . ' ' . $sz[1] . ' számla már <i>létezik</i> - nem importáltam<br />';
					}
				}
			}
			$uzenet .= '<hr>Összesen <i>' . $beImportalva . '</i> számlát nyamiztam be';
			$this->set('uzenet', $uzenet);
		}
	}
}
?>